<?php

namespace Lite\Utils;

use \Lite\Globals\VarServer;
use \Lite\Exception\FileNotFoundException;

abstract class DirectoryUtils extends FileUtils {
	
	/**
	 * Corrige las barras en la ruta
	 *  
	 * @param string $path
	 * @return $path
	 */
	static function fixPath($path) {
		$path = StringUtils::replace($path, '\\', '/');
		$path = StringUtils::replace($path, '//', '/');
		return $path;
	}
	
	/**
	 * Devuelve el directorio actual
	 * 
	 * @return string
	 */
	static function getCurrentDirectory() {
		return self::fixPath( \getcwd());
	}
	
	/**
	 * 
	 */
	static function guessBasePath(){
		$varServer = new varServer();
		$basePath = StringUtils::remove( self::getCurrentDirectory(), $varServer->getDocumentRoot());
		
		if(StringUtils::isEmpty($basePath)) {
			$basePath = '/';
		}
		
		if(!StringUtils::startsWith($basePath, '/')) {
			$basePath = '/' . $basePath;
		}
		
		if(!StringUtils::endsWith($basePath, '/')) {
			$basePath = $basePath . '/';
		}
		return $basePath;
	}
	
	/**
	 * Retorna si la ruta existe y es un directorio
	 * 
	 * @param string $filePath
	 * @return boolean
	 */
	static function isDirectory($dirPath){
		return is_dir($dirPath);
	}
	
	/**
	 * Retorna si el directorio esta vacio
	 * @param string $dirPath
	 */
	public static function isEmpty($dirPath){
		return 0 == count( self::scanDir($dirPath) );
	} 
	
	/**
	 * Retorna un listado de directorios y archivos de un directorio
	 * Adicionalmente se pueden proporcionar filtros extras
	 * 
	 * @param string $dirPath
	 * @param array $filters Opcional
	 * @return array
	 */
	static function scanDirectory($dirPath, array $filters=array()) {
		self::throwIfDirNotFound($dirPath);
		static $filterDots = array('.', '..');
        return array_diff( scandir($dirPath), array_merge($filterDots, $filters));
	}
	/**
	 * Retorna si la ruta es un directorio existente
	 * 
	 * @param string $dirPath
	 * @return boolean
	 */
	static function directoryExists($dirPath) {
		return parent::fileExists($dirPath) && self::isDirectory($dirPath);
	}
	
	/**
	 *
	 */
	private static function throwIfDirNotFound($filePath) {
		if(!self::isDirectory($filePath)) {
			throw new FileNotFoundException("{$filePath} is not readable");
		}
	} 
}